原文連結:Improving the User Experience
在最後一天,我們要來改變UI的布局方式,讓應用程式更美觀。其中包含控制行為定義中的欄位屬性,以及調整metadata擴充項目。
如上圖,預設的Fiori應用程式會根據CDS view的欄位生成對應輸入框(before),而理想則上希望欄位能重新排序,並使部分欄位變成唯讀(after)。
可以透過註釋projection中的相應欄位來設成唯讀,通常會在metadata擴充項目中設定。
行為定義或projection中都可以將欄位設成唯讀,其差異是作用於全域或僅在特定服務中,
由於航班的國家與城市基本上都是固定的,在設定好Determination後就能自動填入欄位。如果未把欄位設成唯讀,就會需要設定更繁瑣的Validation來確保航班與地點正確。
metadata擴充項目是獨立的資料庫物件,包含CDS實體的註解,透過將CDS實體和註解分離以便理解,否則,CDS定義將變得非常長且難以閱讀。
如果想將metadata擴充項目與CDS實體關連在一起,首先需要加入註解@Metadata.allowExtensions: true
來啟用。
...
"允許設置metadata擴展項"
@Metadata.allowExtensions: true
define root view entity ZS4D400_C_CONNECTION
...
as projection on ZS4D400_R_CONNECTION
{
key UUID,
CarrierID,
ConnectionID,
AirportFromID,
...
}
如果使用生成器會自動添加並產生projection的metadata擴充項目,以及projection本身的相應註解。
...
annotate view ZS4D400_C_CONNECTION with {
...
"UI相關註解"
@UI.lineItem: [ {
position: 10, "指定欄位順序"
importance: #MEDIUM,
label:''
}]
@UI.identification: [ {
position: 10, "指定欄位順序"
label:''
}]
CarrierID; "欲指定的欄位"
...
在這裡有兩個主要的UI註解,第一個是@UI.LineItem
,是一個可以設定position屬性的array,position決定了該欄位在提示選單中的位置。
第二個UI註解是@UI.identification
,同樣是可以設定position屬性的array,決定的則是該欄位在單一物件頁面中的位置,將會在新增及修改時顯示。
如上例,由於德國人的慣例是用十的倍數排序,可以將position照上表以10、20、30...來排欄位。
使用者在欄位輸入內容時,可以使用輸入提示的協助,如下圖所示,點擊欄位右側的圖示會呼叫資料庫,跳出相應可填入的提示選單。
"指定資料來源"
define view entity ZS4d400_I_CARRIER_VH as select from /dmo/carrier {
@UI.lineItem:
"提示選單中的順序為10"
[{position: 10, importance: #HIGH}]
key carrier_id as CarrierId, "提示選單要顯示的欄位1"
@UI.lineItem:
"提示選單中的順序為20"
[{position: 20, importance: #HIGH}]
name as Name "提示選單要顯示的欄位2"
}
如上例,[{}]
內的內容是欄位註解,定義了在提示選單中的順序及優先度,當使用者點及UI中的選單,將會顯示所有有註解的欄位。
@Consumption.valueHelpDefinition: [{ entity: {
name: 'ZS4D400_I_CARRIER_VH', "資料來源"
element: 'CarrierId' "回傳值"
}}]
CarrID; "要有提示選單的欄位"
接著,為了獲取對應的欄位提示資料,這裡使用@Consumption.valueHelpDefinition:
註解,同樣是包含了物件實體的array,該實體具有兩個屬性:name
屬性指定作為提示清單資料來源的CDS view;element
則是使用者從提示清單選擇完後要回傳的欄位值。
以上,在這30天中大致講解了Acquiring Core ABAP Skills中的基礎部分,想說反正都要備考就順便參加了鐵人賽,也希望這份學習筆記能幫助到有需要的人~
後續如果有寫進階篇,應該會再找個地方來更新。掰啦!